package main

import "fmt"

func main() {

	// 带缓存的Channel内部持有一个元素队列。队列的最大容量是在调用make函数创建channel时通过第二个参数指定的。
	// 下面的语句创建了一个可以持有三个字符串元素的带缓存Channel。
	// ch := make(chan string, 3)

	fmt.Println(mirroredQuery())
}

// 并发地向三个镜像站点发出请求，三个镜像站点分散在不同的地理位置。它们分别将收到的响应发送到带缓存channel，
// 最后接收者只接收第一个收到的响应，也就是最快的那个响应。因此mirroredQuery函数可能在另外两个响应慢的
// 镜像站点响应之前就返回了结果。
func mirroredQuery() string {
	responses := make(chan string, 3)
	go func() { responses <- request("asia.gopl.io") }()
	go func() { responses <- request("europe.gopl.io") }()
	go func() { responses <- request("americas.gopl.io") }()
	return <-responses // return the quickest response
}

func request(hostname string) (response string) {
	return hostname
	// hello world
}
